package fr.cdesire.sudoku.core;

import fr.cdesire.sudoku.core.commons.Grille;
import fr.cdesire.sudoku.core.exceptions.SudokuCoreException;

/**
 * Cette classe fournit des méthodes statiques permettant de valider une
 * grille à partir des valeurs saisies et de chercher une solution
 * à la grille.
 * 
 * @author cedric.desire@gmail.com
 *
 */
public class Sudoku {

    /**
     * Constructeur privé.
     */
    private Sudoku() {
        super();
    }

    /**
     * Recherche une solution à la grille.
     *
     * @param grille Grille initiale de départ pour la recherche.
     * @return Solution de la grille.
     * @throws SudokuCoreException Exception de type GrilleIncompleteException levée quand
     * le nombre de valeurs saisies est insuffisant pour la résolution.
     * Exception de type GrilleSansSolutionsException levée quand
     * aucune solution existante. Exception de type GrillePlusieursSolutionsException quand 
     * il existe plus d'une solution trouvée.
     */
    public static Grille rechercheSolution(Grille grille) throws SudokuCoreException {

        Validation.verifierGrilleComplete(grille);
        return Recherche.rechercheSolution(grille);
    }

    /**
     * Vérification que la règle Sudoku est respectée : une et une seule
     * même valeur par ligne, une et une seule même valeur par colonne,
     * une et une seule même valeur par région.
     *
     * @param grille Grille à valider.
     * @throws SudokuCoreException Lève une GrilleInvalideException si la
     * grille n'est pas valide.
     */
    public static void valider(Grille grille) throws SudokuCoreException {
        Validation.valider(grille);
    }
}
